package com.stylefeng.guns.demo;

// 令牌桶对业务有一定的容忍度
public class TokenBucket {

    // 桶的容量
    private int bucketNums = 100;
    // 流入速度
    private int rate;
    // 当前令牌数量
    private int nowTokens;
    // 时间
    private long timestmap = getNowTime();

    private long getNowTime() {
        return System.currentTimeMillis();
    }

    private int min(int tokens) {
        if (bucketNums > tokens) {
            return tokens;
        } else {
            return bucketNums;
        }
    }

    public boolean getToken() {
        // 记录来拿令牌的时间
        long nowTime = getNowTime();
        // 添加令牌【判断该有多少个令牌】
        nowTokens = nowTokens + (int) (nowTime - timestmap) * rate;
        // 添加以后的令牌数量与桶的容量那个大小
        nowTokens = min(nowTokens);
        // 修改拿令牌的时间
        timestmap = nowTime;
        // 判断令牌是否足够
        if (nowTokens > 1) {
            return true;
        } else {
            return false;
        }
    }

    public static void main(String[] args) throws InterruptedException {
        TokenBucket tokenBucket = new TokenBucket();
        for (int i = 0; i < 100; i++) {
            if (i == 10) {
                Thread.sleep(500);
            }
            System.out.println("第" + i + "次请求结果 = " + tokenBucket.nowTokens);
        }
    }
}
